package com.example.libpro.DBEntity;

import java.io.Serializable;

/**
 * 图书管理系统借阅记录数据实体类
 * 作用：1. 封装借阅核心信息，映射数据库"borrow_record"表结构；2. 作为各层（DAO层、服务层、用户层）间借阅数据的传输载体；
 * 3. 支持借还业务的数据追踪（如借阅时间、应还时间、逾期状态）
 * 关联表：borrow_record（借阅记录表），关联user表（user_id）、book表（book_id）
 * 核心属性：借阅ID、用户ID、图书ID、借阅时间、应还时间、实际归还时间、借阅状态、审核状态
 */
public class BorrowRecordEntity implements Serializable {
    // 序列化ID（用于跨组件传输，如Intent传递借阅记录）
    private static final long serialVersionUID = 1L;

    // 核心属性（与"borrow_record"表字段一一对应）
    private Integer borrowId;        // 借阅ID（自增主键，数据库生成）
    private Integer userId;          // 关联用户表的user_id（非空）
    private Integer bookId;          // 关联图书表的book_id（非空）
    private Long borrowTime;         // 借阅时间（时间戳，毫秒，非空，如System.currentTimeMillis()）
    private Long dueTime;            // 应还时间（时间戳，毫秒，非空，如借阅后7天）
    private Long actualReturnTime;   // 实际归还时间（时间戳，毫秒，未还时为null）
    private Integer borrowStatus;    // 借阅状态（0=未还，1=已还，2=逾期，非空）
    private Integer auditStatus;     // 审核状态（0=待审核，1=已通过，2=已拒绝，非空，默认0）

    // 无参构造（用于Gson解析、DAO层查询结果映射）
    /**
     * 无参构造方法
     * 功能：供JSON解析（如Gson）、DAO层Cursor结果映射时创建对象，避免反射报错
     */
    public BorrowRecordEntity() {
    }

    // 全参构造（用于创建完整借阅记录对象，如借书时）
    /**
     * 全参构造方法（不含borrowId，因borrowId为自增主键，由数据库生成）
     * @param userId 用户ID（关联user表，非空）
     * @param bookId 图书ID（关联book表，非空）
     * @param borrowTime 借阅时间（时间戳，毫秒，非空）
     * @param dueTime 应还时间（时间戳，毫秒，非空，如borrowTime + 7*24*60*60*1000）
     * @param actualReturnTime 实际归还时间（未还时传null）
     * @param borrowStatus 借阅状态（0=未还，1=已还，2=逾期，非空，初始为0）
     * @param auditStatus 审核状态（0=待审核，1=已通过，2=已拒绝，非空，初始为0）
     * 功能：创建完整的借阅记录对象（除自增ID外），用于DAO层插入数据
     */
    public BorrowRecordEntity(Integer userId, Integer bookId, Long borrowTime, Long dueTime, Long actualReturnTime, Integer borrowStatus, Integer auditStatus) {
        this.userId = userId;
        this.bookId = bookId;
        this.borrowTime = borrowTime;
        this.dueTime = dueTime;
        this.actualReturnTime = actualReturnTime;
        this.borrowStatus = borrowStatus;
        this.auditStatus = auditStatus;
    }

    // Getter与Setter方法
    /**
     * 获取借阅ID（自增主键）
     * @return Integer 借阅ID（null表示未插入数据库）
     */
    public Integer getBorrowId() {
        return borrowId;
    }

    /**
     * 设置借阅ID（仅DAO层使用，因ID由数据库生成）
     * @param borrowId 借阅ID（数据库自增返回的值）
     */
    public void setBorrowId(Integer borrowId) {
        this.borrowId = borrowId;
    }

    /**
     * 获取关联的用户ID
     * @return Integer 用户ID（非空，关联user表）
     */
    public Integer getUserId() {
        return userId;
    }

    /**
     * 设置关联的用户ID
     * @param userId 用户ID（非空，需确保在user表中存在）
     */
    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    /**
     * 获取关联的图书ID
     * @return Integer 图书ID（非空，关联book表）
     */
    public Integer getBookId() {
        return bookId;
    }

    /**
     * 设置关联的图书ID
     * @param bookId 图书ID（非空，需确保在book表中存在且未删除）
     */
    public void setBookId(Integer bookId) {
        this.bookId = bookId;
    }

    /**
     * 获取借阅时间
     * @return Long 借阅时间（时间戳，毫秒，非空）
     */
    public Long getBorrowTime() {
        return borrowTime;
    }

    /**
     * 设置借阅时间
     * @param borrowTime 借阅时间（时间戳，毫秒，非空，建议用System.currentTimeMillis()）
     */
    public void setBorrowTime(Long borrowTime) {
        this.borrowTime = borrowTime;
    }

    /**
     * 获取应还时间
     * @return Long 应还时间（时间戳，毫秒，非空）
     */
    public Long getDueTime() {
        return dueTime;
    }

    /**
     * 设置应还时间
     * @param dueTime 应还时间（时间戳，毫秒，非空，需晚于borrowTime）
     */
    public void setDueTime(Long dueTime) {
        this.dueTime = dueTime;
    }

    /**
     * 获取实际归还时间
     * @return Long 实际归还时间（时间戳，毫秒，未还时为null）
     */
    public Long getActualReturnTime() {
        return actualReturnTime;
    }

    /**
     * 设置实际归还时间
     * @param actualReturnTime 实际归还时间（时间戳，毫秒，还书时设置，未还时传null）
     */
    public void setActualReturnTime(Long actualReturnTime) {
        this.actualReturnTime = actualReturnTime;
    }

    /**
     * 获取借阅状态
     * @return Integer 借阅状态（0=未还，1=已还，2=逾期，非空）
     */
    public Integer getBorrowStatus() {
        return borrowStatus;
    }

    /**
     * 设置借阅状态
     * @param borrowStatus 借阅状态（0=未还，1=已还，2=逾期，非空；还书时设为1，逾期时设为2）
     */
    public void setBorrowStatus(Integer borrowStatus) {
        this.borrowStatus = borrowStatus;
    }

    /**
     * 获取审核状态
     * @return Integer 审核状态（0=待审核，1=已通过，2=已拒绝，非空）
     */
    public Integer getAuditStatus() {
        return auditStatus;
    }

    /**
     * 设置审核状态
     * @param auditStatus 审核状态（0=待审核，1=已通过，2=已拒绝，非空；管理员审核后更新）
     */
    public void setAuditStatus(Integer auditStatus) {
        this.auditStatus = auditStatus;
    }

    // toString方法（用于调试）
    /**
     * 重写toString方法
     * @return String 借阅记录对象的字符串表示（含所有属性值）
     * 功能：调试时打印借阅记录信息，便于定位借还业务问题（如逾期判断）
     */
    @Override
    public String toString() {
        return "BorrowRecordEntity{" +
                "borrowId=" + borrowId +
                ", userId=" + userId +
                ", bookId=" + bookId +
                ", borrowTime=" + borrowTime +
                ", dueTime=" + dueTime +
                ", actualReturnTime=" + actualReturnTime +
                ", borrowStatus=" + borrowStatus +
                ", auditStatus=" + auditStatus +
                '}';
    }
}